
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>nfs原理及安装配置</title>
            </head>
            <body>
            <a href="https://andyoung.blog.csdn.net">原作者博客</a>
            <div id="content_views" class="markdown_views prism-atom-one-light">
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <h3><a id="_0"></a>一、简介</h3> 
<p>NFS（Network File System）即网络文件系统，它允许网络中的计算机之间通过网络共享资源。将NFS主机分享的目录，挂载到本地客户端当中，本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件，在客户端端看起来，就像访问本地文件一样。</p> 
<p>RPC，基于C/S模型。程序可以使用这个协议请求网络中另一台计算机上某程序的服务而不需知道网络细节，甚至可以请求对方的系统调用。</p> 
<p>对于Linux而言，文件系统是在内核空间实现的，即文件系统比如ext3、ext4等是在Kernel启动时，以内核模块的身份加载运行的。</p> 
<h3><a id="_12"></a>二、原理</h3> 
<p>NFS本身的服务并没有提供数据传递的协议，而是通过使用RPC（远程过程调用 Remote Procedure Call）来实现。当NFS启动后，会随机的使用一些端口，NFS就会向RPC去注册这些端口。RPC就会记录下这些端口，RPC会开启111端口。通过client端和sever端端口的连接来进行数据的传输。在启动nfs之前，首先要确保rpc服务启动。</p> 
<p>具体过程如下：</p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/311152a69f24a721e7346c1a9af40495.png" alt="img"></p> 
<ol><li>本地用户要访问nfs服务器中文件，先向内核发起请求，内核处理调用nfs模块及rpc client</li><li>rpc client向rpc server发起连接</li><li>在连接之前，NFS服务除了启动nfsd本身监听的端口2049/tcp和2049/udp，还会启动其它进程（如mountd，statd，rquotad等）以完成文件共享，这些进程的端口是不固定的；是每次NFS服务启动时向RPC服务注册的，RPC服务会随机分配未使用的端口</li><li>完成连接，接受访问请求</li><li>nfs应用程序向内核发起请求</li><li>内核调用文件系统</li></ol> 
<p>​ 然后client端通过获取的NFS端口来建立和server端的NFS连接并进行数据的传输。</p> 
<p>以下为启动<strong>各服务的作用</strong></p> 
<p><strong>rpc：</strong> 远程过程调用协议，是实现本地调用远程主机实现系统调用的协议。</p> 
<p><strong>portmapper：</strong> 负责分配rpc server的端口，并在client端请求时，负责响应目的rpc server端口返回给client端，工作在tcp与udp的111端口上。</p> 
<p><strong>mountd：</strong> 是nfs服务的认证服务的守护进程，client在收到返回的真正端口时，就会去连接mountd，认证取得令牌。</p> 
<p><strong>nfsd：</strong> nfs的守护进程，负责接收到用户的调用请求后与内核发出请求并得到调用结果响应给用户，工作在tcp和udp的2049端口。</p> 
<p><strong>idmapd：</strong> 是NFS的一个程序，用来负责远程client端创建文件后的权限问题。</p> 
<p><strong>quotad：</strong> 用于实现磁盘配额，当client端挂载nfs后可以限制磁盘空间的大小。</p> 
<h3><a id="NFS_49"></a>三、NFS服务配置安装</h3> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/d91a2f621e0978129d6176eb46652ec0.png" alt="img"></p> 
<h4><a id="_57"></a><strong>相关配置文件及命令的使用</strong></h4> 
<p><code>vi /etc/exports</code></p> 
<p><code>/path/to/somedir CLIENT_LIST</code></p> 
<p>多个客户之间使用空白字符分隔</p> 
<p>每个客户端后面必须跟一个小括号，里面定义了此客户访问特性，如访问权限等</p> 
<p><code>172.16.0.0/16(ro,async) 192.16.0.0/24(rw,sync) *(ro)</code></p> 
<h5><a id="_71"></a>权限属性：</h5> 
<ul><li> <p>ro:只读</p> </li><li> <p>rw:读写</p> </li><li> <p>sync:同步，数据同步写到内存与硬盘中</p> </li><li> <p>async:异步，数据先暂存内存</p> </li><li> <p>root_squash: 将root用户映射为来宾账号</p> </li><li> <p>no_root_squash: 有root的权限，不建议使用</p> </li><li> <p>all_squash: 全部映射为来宾账号</p> </li><li> <p>anonuid, anongid: 指定映射的来宾账号的UID和GID</p> </li></ul> 
<h5><a id="exportfs_91"></a>exportfs命令(导出:主节点重新配置挂载)：</h5> 
<p>-a：跟-r或-u选项同时使用，表示重新挂载所有文件系统或取消导出所有文件系统；</p> 
<p>-r: 重新导出</p> 
<p>-u: 取消导出</p> 
<p>-v: 显示详细信息</p> 
<h5><a id="showmount_103"></a>showmount命令：</h5> 
<ul><li> <p>showmount -e NFS_SERVER: 查看NFS服务器"导出"的各文件系统</p> </li><li> <p>showmount -a NFS_SERVER: 查看NFS服务器所有被挂载的文件系统及其挂载的客户端对应关系列表</p> </li><li> <p>showmount -d NFS_SERVER: 显示NFS服务器所有导出的文件系统中被客户端挂载了文件系统列表</p> </li></ul> 
<h5><a id="rpcinfo_113"></a>rpcinfo</h5> 
<p><code>-p hostname(orIP)</code></p> 
<p>-p ：显示所有的 port 与 program 的信息！</p> 
<p>如果要让<code>mountd</code>和<code>quotad</code>等进程监听在固定端口，编辑配置文件<code>/etc/sysconfig/nfs</code></p> 
<p>客户端使用mount命令挂载</p> 
<p><code>mount -t nfs NFS_SERVER:/PATH/TO/SOME_EXPORT /PATH/TO/SOMEWHRERE</code></p> 
<h4><a id="_131"></a><strong>安装配置</strong></h4> 
<p>环境准备：</p> 
<p>server端：192.168.1.222 centos 7</p> 
<p>client端：192.168.1.200 centos 6.5</p> 
<h5><a id="1nfs_139"></a>1.在服务端安装nfs，</h5> 
<p><code>yum install nfs-utils rpcbind -y</code></p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/c13e29e297d58022d2fd55e0c793a9d3.png" alt="img"></p> 
<h5><a id="2etcexportsnfs_146"></a>2.编辑/etc/exports，并启动nfs</h5> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/7d6fe2c2ed4bf233f62e21c9703bc1b7.png" alt="img"></p> 
<p>启动：　　<code>systemctl start nfs</code></p> 
<p>开机自启 ：<code>systemctl start nfs</code></p> 
<h5><a id="3nfsutilsrpcbindrpcbind_153"></a>3.客户端同样安装nfs-utils和rpcbind并启动，必须先启动rpcbind，否则报错（注意防火墙等）</h5> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/057d03146f4a6e5e78af914f469987e9.png" alt="img"></p> 
<h5><a id="4_157"></a>4.挂载并查看挂载信息</h5> 
<p>客户端挂载<br> 　 <code>mount -t nfs 192.168.1.222:/var/nfs /mnt</code></p> 
<p><code>showmount –e 192.168.1.222</code></p> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/6fd91d762ae0a4518f6f041af85a7443.png" alt="img"></p> 
<p>在服务器端/var/nfs创建目录或文件，并在客户端/mnt查看即可。</p> 
<h3><a id="_170"></a>将所有用户映射为来宾账号实验</h3> 
<ol><li> <p>在服务器端添加用户hot，并修改配置文件并重新挂载文件系统</p> <p>添加用户</p> <p><code>useradd –u 520 hot</code></p> <p>修改/etc/exports</p> <p><code>/var/nfs 192.168.1.0/24(rw,async,all_squash,anonuid=520)</code></p> <p>重新挂载导出</p> <p><code>exportfs –ra</code></p> <p><img src="https://i-blog.csdnimg.cn/blog_migrate/ae0e2a9aa9bf2532d5471baf55eb1e4f.png" alt="img"></p> </li><li> <p>在客户端上添加用户code，分别在code用户和root用户下创建文件，查看文件属性</p> <p><img src="https://i-blog.csdnimg.cn/blog_migrate/8e61d861acaec6b6da757d5a00c57f9a.png" alt="img"></p> <p><img src="https://i-blog.csdnimg.cn/blog_migrate/178bc304987ac17a4b248e5e877f5896.png" alt="img"></p> <p>可以看到文件属主都为服务器端设置好的来宾账号hot的uid</p> <p>让mountd和quotad等进程监听在固定端口，编辑配置文件/etc/sysconfig/nfs，取消注释</p> <p><img src="https://i-blog.csdnimg.cn/blog_migrate/40abf32d85bb7aa40219aebadb9cfce6.png" alt="img"></p> <p>重启nfs，查看端口</p> <p><img src="https://i-blog.csdnimg.cn/blog_migrate/08081b81e1d4df56b624f7866fe292ff.png" alt="img"></p> </li></ol>
                </div>
            </body>
            </html>
            